'''
    1. 这里主要演示一下，Python的鸭子类型，和多态。
    2. 通过下边好几个例子，只要说的是鸭子类型的作用。
        1）.如果我们想要调用不同类下的方法，我们可以把函数名写为一致，然后就可以调用不同类下的所有函数，这就是多态，也是鸭子类型。
        2）.我们还可以组合数据,进行组合添加，可以是类的，可以是函数的，还可以是迭代类型的。列子详情可以看最下边的迭代鸭子类型。
'''
'''
    1. 什么叫做鸭子类型呢，就是有一样的形态,一个鸟会走,会跑,会飞。
'''
# 我们这里定义了三个类，表明他有三个方法。
class Cat(object):
    def say(self):
        print("我会走")
class Dog(object):
    def say(self):
        print("我会叫")
class Duck(object):
    def say(self):
        print("我是鸭子会走")
# 1. 在这里我们定义一个变量名,接受实例化类。
# 但是我们这个方法有坏处，只能调用一个类去实现一个，我们有什么方法直接调用全部呢，可以看一下步的多态。
animal=Cat()
animal.say()

'''
下边 2.这个就是一个鸭子类型，多态的列子，Python的多态呢，只要函数名是一致的，我们就可以通过实例化然后调用。
'''
# 2. 我们在这里定义一个列表，接受实例化类。
animal_list=[Cat,Dog,Duck]
# 我们这里在循环获取animal_list里边的数据
for i in animal_list:
    # 然后我们这里调用同样的say方法。
    i().say()
'''
1. 我在这里演示一个列子，迭代的鸭子类型,我在这里用到了一个extend方法。
2. 如果a.extend(b)输出结果肯定是,a,b的组合内容，extend就是一个延续的方法，这是一个列表的形式。
3. 这是一个元组的形式，在做讲解。
'''
# 这是列表的添加
a=["jin","jinbo"]
b=["jin1","jin2"]
# 这是序列元组的添加
name_set=set()
# 我们这里只能添加一个值。
name_set.add("jin3")
name_set.add("jin4")
# 这是魔法方法的迭代添加
class Name(object):
    def __init__(self,name_list):
        self.name_list=name_list
    def __getitem__(self, item):
        return self.name_list[item]
My_Name=Name(["jin7","jin8","jin9"])
# 这是列表的添加。
# a.extend(b)
# print(a)
# 这是元组的的添加
# a.extend(name_set)
# print(a)
# 这是魔法方法的迭代添加
a.extend(My_Name)
print(a)